package com.example.gateway.utils;

import com.example.gateway.properties.JwtProperties;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.crypto.SecretKey;
import java.util.Date;

@Component
public class JwtUtil {

    private final JwtProperties jwtProperties;
    private final SecretKey secretKey;

    @Autowired
    public JwtUtil(JwtProperties jwtProperties) {
        this.jwtProperties = jwtProperties;
        this.secretKey = Keys.hmacShaKeyFor(jwtProperties.getSecretKey().getBytes());
    }

    /**
     * 生成 JWT
     *
     * @param username 用户名
     * @param role     用户角色
     * @return 生成的 JWT
     */
    public String generateToken(String username, String role) {
        return Jwts.builder()
                // 设置主题（通常是用户名）
                .subject(username)
                // 添加自定义声明（如用户角色）
                .claim("role", role)
                // 签发者
                .issuer(jwtProperties.getIssuer())
                // 设置签发时间
                .issuedAt(new Date())
                // 设置过期时间
                .expiration(new Date(System.currentTimeMillis() + jwtProperties.getExpirationTimeInMillis()))
                // 使用密钥签名
                .signWith(secretKey)
                // 生成最终的 JWT 字符串
                .compact();
    }

    /**
     * 验证 JWT 是否有效
     *
     * @param token JWT
     * @return 是否有效
     */
    public boolean validateToken(String token) {
        try {
            // 尝试解析 JWT
            Jwts.parser()
                    // 设置验证密钥
                    .verifyWith(secretKey)
                    .build()
                    // 解析并验证 JWT
                    .parseSignedClaims(token);
            // 如果解析成功，返回 true
            return true;
        } catch (Exception e) {
            // 如果解析失败，返回 false
            return false;
        }
    }

    /**
     * 从 JWT 中解析数据
     *
     * @param token JWT
     * @return 用户名
     */
    public String getUsernameFromToken(String token) {
        // 解析 JWT
        Jws<Claims> claimsJws = Jwts.parser()
                // 设置验证密钥
                .verifyWith(secretKey)
                .build()
                // 解析并验证 JWT
                .parseSignedClaims(token);
        // 获取主题（用户名）
        return claimsJws.getPayload().getSubject();
    }

}